#ifndef HISTORYMODEL_H
#define HISTORYMODEL_H

#include <QSqlTableModel>
#include <QDateTime>
#include <QString>

/**
 * @brief 历史数据模型
 * @details 继承 QSqlTableModel，为 QML 提供历史数据查询：
 *          - 基于 SQLite realtime_data 表
 *          - 支持时间范围查询
 *          - 支持按设备 ID 过滤
 *          - 支持分页加载（性能优化）
 *          - 自动映射数据库字段到 QML
 */
class HistoryModel : public QSqlTableModel
{
    Q_OBJECT
    Q_PROPERTY(QString deviceId READ deviceId WRITE setDeviceId NOTIFY deviceIdChanged)
    Q_PROPERTY(QDateTime startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged)
    Q_PROPERTY(QDateTime endTime READ endTime WRITE setEndTime NOTIFY endTimeChanged)
    Q_PROPERTY(int recordCount READ recordCount NOTIFY recordCountChanged)

public:
    explicit HistoryModel(QObject *parent = nullptr);
    ~HistoryModel();

    // 重写数据方法以自定义显示格式
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    // 过滤条件
    QString deviceId() const { return m_deviceId; }
    void setDeviceId(const QString &deviceId);

    QDateTime startTime() const { return m_startTime; }
    void setStartTime(const QDateTime &startTime);

    QDateTime endTime() const { return m_endTime; }
    void setEndTime(const QDateTime &endTime);

    // 记录数量
    int recordCount() const;

    // 查询历史数据（应用过滤条件）
    Q_INVOKABLE bool queryHistoryData();

    // 快捷查询方法
    Q_INVOKABLE bool queryLastHours(const QString &deviceId, int hours);
    Q_INVOKABLE bool queryLastDays(const QString &deviceId, int days);
    Q_INVOKABLE bool queryDateRange(const QString &deviceId, const QDateTime &start, const QDateTime &end);
    Q_INVOKABLE bool queryToday(const QString &deviceId);
    Q_INVOKABLE bool queryYesterday(const QString &deviceId);

    // 获取统计信息
    Q_INVOKABLE double getAverageTemperature() const;
    Q_INVOKABLE double getAveragePressure() const;
    Q_INVOKABLE double getAverageFlow() const;

    Q_INVOKABLE double getMaxTemperature() const;
    Q_INVOKABLE double getMaxPressure() const;
    Q_INVOKABLE double getMaxFlow() const;

    Q_INVOKABLE double getMinTemperature() const;
    Q_INVOKABLE double getMinPressure() const;
    Q_INVOKABLE double getMinFlow() const;

    // 清空过滤条件
    Q_INVOKABLE void clearFilters();

    // 刷新数据
    Q_INVOKABLE void refresh();

signals:
    // 过滤条件变化信号
    void deviceIdChanged();
    void startTimeChanged();
    void endTimeChanged();

    // 记录数量变化信号
    void recordCountChanged();

    // 查询完成信号
    void queryCompleted(bool success, int recordCount);

private:
    // 构建 WHERE 子句
    QString buildWhereClause() const;

    // 应用过滤器
    void applyFilters();

private:
    QString m_deviceId;    // 设备 ID 过滤
    QDateTime m_startTime; // 开始时间
    QDateTime m_endTime;   // 结束时间
};

#endif // HISTORYMODEL_H
